import singleton from "./Singleton";
import Api from "@/api/api-declare";
import type { ApiLocationTypes } from "@/api/api-types/api-location-types";
import { WxHelp } from "../libs/wx-help";
import { UniHelp } from "../libs/uni-help";

class LocationMgr {
	//最近一次的坐标数据，无论通过geiLocation或者onLocationChange 得到的坐标，都会存在这里
	location = {
		latitude : 0,
		longitude : 0
	};
	isInBackground = false;//是否在后台定位
	constructor () {
		this.getLocation();//初始调用一次位置授权，目的为了取得用户的同意
	}
	/**
	 * 开始后台定位
	 */
	async startBackgroundLocation () {
		
		if (this.isInBackground) return;
		const hasPermission = await WxHelp.getPermission('scope.userLocationBackground');
		if (!hasPermission) {
			console.error('不具备后台定位权限，后台定位开启失败...');
			return this;
		};
		this.isInBackground = true;
		uni.startLocationUpdateBackground({});
		uni.onLocationChange(res => {
			res.latitude && (this.location.latitude);
			res.longitude && (this.location.longitude);
		});
		return this;
	}
	/**
	 * 停止后台定位
	 */
	stopBackgroundLocation () {
		this.isInBackground = false;
		uni.stopLocationUpdate();
		return this;
	}
	
	noPermissionHandler () {
		//@todo  无权限，根据需求处理后续逻辑
	}
	/**
	 * 获取坐标信息
	 */
	getLocation () : Promise<{latitude : number, longitude : number}> {
		return new Promise((r,j) => {
			if (this.isInBackground) {
				return r(this.location);
			};
			UniHelp.getLocation().then(res => {
				this.location.latitude = res.latitude;
				this.location.longitude = res.longitude;
				r(this.location);
			}).catch(err => {
				UniHelp.modal('定位失败，请检查定位权限是否开启');
				WxHelp.WxLogger.error('微信api调用失败：getLocation，', err);
				j();
			});
		});
	}

	getLocationAddress () : Promise<ApiLocationTypes.LocationParseDto> {
		return new Promise(async (r, j) => {
			try {
				const {latitude, longitude} = await this.getLocation();	
				Api.ApiLocation.locationParse({
					latitude,
					longitude,
				}).then(res => {
					r({
						...res,
						latitude,
						longitude,
					});
				});
			} catch (error) {
				UniHelp.toast('获取位置失败');
				j();
			};
		});
	}

	/**
	 * 选择位置，所有的选择位置统一走这里，方便管理
	 */
	chooseLocation () : Promise<ApiLocationTypes.LocationParseDto> {
		return new Promise((r, j) => {
			UniHelp.chooseLocation().then(res => {
				Api.ApiLocation.locationParse({
					latitude : res.latitude,
					longitude : res.longitude
				}).then(parseRes => {
					r({
						...parseRes,
						latitude : res.latitude,
						longitude : res.longitude,
						address : parseRes.address || res.address
					});
				});
			}).catch(err => {
				WxHelp.WxLogger.error('微信api调用失败：choolseLocation，', err);
				j();
			});
		});
	}

	/**
	 * 打开位置
	 */
	openLocation (address : string, latitude : number, longitude : number ) {
		if (!address || !latitude || !longitude) {
			throw new Error('location-msg openlocation参数错误');
		};
		wx.openLocation({
			address : address,
			latitude : latitude,
			longitude : longitude
		});
	}
}

const SingleLocationMgr = singleton(LocationMgr);
const locationMgr = new SingleLocationMgr();
export default locationMgr;
